summaryrefslogtreecommitdiffstats
path: root/src/generate_parse_functions.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/generate_parse_functions.php')
-rwxr-xr-xsrc/generate_parse_functions.php112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/generate_parse_functions.php b/src/generate_parse_functions.php
new file mode 100755
index 0000000..23eca49
--- /dev/null
+++ b/src/generate_parse_functions.php
@@ -0,0 +1,112 @@
+#!/usr/bin/env php
+<?php
+$s = [
+ "user" => [
+ "members" => [
+ "username" => [
+ "json" => "username",
+ "type" => "string"
+ ],
+ "discriminator" => [
+ "json" => "discriminator",
+ "type" => "number"
+ ]
+ ]
+ ],
+ "channel" => [
+ "members" => [
+ "name" => [
+ "json" => "name",
+ "type" => "string"
+ ],
+ "type" => [
+ "json" => "type",
+ "type" => "number"
+ ]
+ ],
+ "parsing" => [
+ "checks" => [
+ 'DC_CHANNEL_SUPPORTED(cJSON_GNV(cJSON_GOI(s, "type")))'
+ ],
+ "code" => <<<HEREDOC
+ cJSON_AFE(o, cJSON_GOI(s, "recipient_ids")) {
+ char * c = cJSON_GSV(o);
+ if (!c)
+ continue;
+ struct dc_user * u = dc_user_init();
+ u->id = strtoull(st, NULL, 10);
+ u = dc_addr_user(p, DC_ISAE(p->users), u, DC_MAY_FREE);
+ dc_add_user(DC_ISAE(ch->users), u, 0);
+ }
+ HEREDOC,
+ ]
+ ]
+];
+foreach ($s as $name => $fields) {
+ echo <<<HEREDOC
+ struct dc_$name * dc_parse_$name (struct dc_program * p, const cJSON * s) {
+ cJSON * o;
+ if (!s) /* in case cJSON_GOIx returns NULL */
+ return NULL;
+ char * c = cJSON_GSV(cJSON_GOI(s, "id"));
+ if (!c)
+ return NULL;
+ unsigned long long int i = strtoull(c, NULL, 10);
+ struct dc_$name * n = dc_find_$name(p->{$name}s, p->{$name}s_length, i);
+
+ HEREDOC;
+ if (isset($fields["parsing"]) && sizeof($fields["parsing"]["checks"])) {
+ echo " if (";
+ $arr = $fields["parsing"]["checks"];
+ foreach ($arr as $n => $check) {
+ $or = "";
+ $end = "";
+ if ($n != array_key_first($arr))
+ $or = " || ";
+ if ($n != array_key_last($arr))
+ $end = PHP_EOL;
+ echo "$or!($check)$end";
+ }
+ echo <<<HEREDOC
+ )
+ return NULL;
+
+ HEREDOC;
+ }
+ echo <<<HEREDOC
+ if (!n) {
+ n = dc_{$name}_init();
+ n->id = i;
+ dc_addr_$name(p, DC_ISAE(p->{$name}s), n, 0);
+ }
+
+ HEREDOC;
+ if (isset($fields["parsing"]))
+ echo $fields["parsing"]["code"] . PHP_EOL;
+ foreach ($fields["members"] as $member => $meta) {
+ switch ($meta["type"]) {
+ case "string":
+ echo <<<HEREDOC
+ if ((c = cJSON_GSV(cJSON_GOI(s, "{$meta["json"]}")))) {
+ free(n->$member);
+ n->$member = strdup(c);
+ }
+
+ HEREDOC;
+ break;
+ case "number":
+ echo <<<HEREDOC
+ if ((o = cJSON_GOI(s, "{$meta["json"]}")))
+ n->$member = cJSON_GNV(o);
+
+ HEREDOC;
+ break;
+ }
+ }
+ echo <<<HEREDOC
+ return n;
+ }
+
+ HEREDOC;
+}
+?>